using System;
using System.Collections.Generic;
using cfg;
using UnityEngine;
using QFramework;
using Random = UnityEngine.Random;

namespace XCZProject
{
	
	/// <summary>
	/// 敌人生成器
	/// </summary>
	public partial class EnemyGenerator : ViewController,IController
	{

		[SerializeField]
		public LevelConfig Config;
		
		// 当前波次中每个敌人间隔多少秒会生成，比如1秒生成1个敌人
		private float mCurrentSecond = 0;
		
		// 时间计时器，计算当前波次时间是否达到条件，是否要生成下一波茨敌人
		// 比如当前波次的总时间为20秒，则达到20秒后，停止生成敌人，进入下一波敌人生成
		private float mCurrentWaveSeconds = 0;

		// 敌人波次数据列表
		//public List<EnemyWave> EnemyWaves = new List<EnemyWave>();

		private Queue<EnemyWave> mEnemyWaveQueue = new Queue<EnemyWave>();

		// 当前正在生成的波次
		public int WaveCount = 0;

		// 一共的波次
		private int mTotalCount = 0;
		
		// 是否是最后一波敌人，数据计算的是当前的波次==敌人列表的数量
		public bool LastWave => WaveCount == mTotalCount;

		public EnemyWave CurrentWave => mCurrentWave;

		// 当前敌人数量
		public static BindableProperty<int> EnemyCount = new BindableProperty<int>(0);
		
		private void Start()
		{
			// 把敌人波次列表数据加入到queue中
			// 为什么要用queue而不用liest，是因为queue波次取出后会自动删除列表里的这个数据
			Debug.Log("开始加载关卡配置.....");
			// foreach (var group in Config.EnemyWaveGroups)
			// {
			// 	foreach (var wave in group.Waves)
			// 	{
			// 		mEnemyWaveQueue.Enqueue(wave);
			// 		mTotalCount++;
			// 	}
			// }
			TbLevelConfig levelConfig = this.GetSystem<ConfigSystem>().LevelConfig;
			foreach (var level in levelConfig.DataList)
			{
				var enemyWave = new EnemyWave()
				{
					Name = level.Name,
					Active = level.Active,
					GenerateDuration = level.GenerateDuration,
					enemyPrefab = Resources.Load<GameObject>("Prefab/Enemy/"+level.EnenmyPrefabName),
					Seconds = level.Seconds,
					HpScale = level.HpScale,
					SpeedScale = level.SpeedScale
				};
				Debug.Log("加载配置，编号："+enemyWave.Name+"，预设体："+enemyWave.enemyPrefab);
				mEnemyWaveQueue.Enqueue(enemyWave);
				mTotalCount++;
			}
		}

		// 当前的波次信息
		private EnemyWave mCurrentWave = null;
		
		private void Update()
		{
			//print("是否最后一波："+LastWave+"，是否还有敌人："+FindObjectOfType<Enemy>(false));
			// 如果当前波次为空，则会从波次列表中取出一个波次进行生成
			if (mCurrentWave==null)
			{
				if (mEnemyWaveQueue.Count>0)
				{
					WaveCount++;
					//print("开始生成新一波敌人！波次："+WaveCount);
					mCurrentWave = mEnemyWaveQueue.Dequeue();
					mCurrentSecond = 0;
					mCurrentWaveSeconds = 0;
				}
				else
				{
					//print("所有敌人已经生成完毕，没有敌人了！");
				}
			}

			// 如果当前波次数据存在，则生成波次中的敌人
			if (mCurrentWave!=null)
			{
				mCurrentSecond += Time.deltaTime;
				mCurrentWaveSeconds += Time.deltaTime;
				
				// 每隔1秒中生成一个敌人
				if (mCurrentSecond>=mCurrentWave.GenerateDuration)
				{
					mCurrentSecond = 0;
					var player = Player.Default;
					// 只有当角色存在时才会生成敌人
					if (player)
					{
						// 设置敌人生成的坐标在摄像机范围外
						// 随机一个值，-1或者1
						var xOry = RandomUtility.Choose(-1, 1);
						var pos = Vector2.zero;
						if (xOry==-1)
						{
							pos.x = RandomUtility.Choose(CameraController.LBTrans.position.x,
								CameraController.RTTrans.position.x);
							pos.y = Random.Range(CameraController.LBTrans.position.y,
								CameraController.RTTrans.position.y);
						}
						else
						{
							pos.x = Random.Range(CameraController.LBTrans.position.x,
								CameraController.RTTrans.position.x);
							pos.y = RandomUtility.Choose(CameraController.LBTrans.position.y,
								CameraController.RTTrans.position.y);
						}
						
						// 确认生成敌人时的随机坐标
						// var randomAngle = Random.Range(0, 360f);
						// var randomRadius = randomAngle * Mathf.Deg2Rad;
						// var direction = new Vector3(Mathf.Cos(randomRadius), Mathf.Sin(randomRadius));
						// var generatePos = player.transform.position + direction * 10;
						mCurrentWave.enemyPrefab.Instantiate()
							.Position(pos)
							.Self(self =>
							{
								var enemy = self.GetComponent<IEnemy>();
								enemy.SetSpeedScale(mCurrentWave.SpeedScale);
								enemy.SetHpScale(mCurrentWave.HpScale);
							})
							.Show();
					}
				}

				// 如果波次时间超过波次时间条件，则把当前波次置空
				// 则下一帧会重新从列表中获取新的波次数据，生成新的波次敌人
				if (mCurrentWaveSeconds>=mCurrentWave.Seconds)
				{
					mCurrentWave = null;
				}
			}
		}

		public IArchitecture GetArchitecture()
		{
			return Global.Interface;
		}
	}
}
